package com.shen.volatiledemo;

//不保证原子性
public class Demo02 {
    //volatile 并不保证原子性，他只保证可见性和有序性，这里多个线程都可以操作num
    private static volatile int num=0;

    public static void add(){
        num++;
    }
    public static void main(String[] args) {

        for (int i = 0; i < 20; i++) {
            new Thread(()->{
                for (int j = 0; j < 1000; j++) {
                    add();
                }
            }).start();
        }

        while (Thread.activeCount()>2){//main gc
            Thread.yield();
        }

        System.out.println(Thread.currentThread().getName()+" "+num);
        /**
         * 理论上输出20000
         *
         * 输出结果为：
         * main 18907
         * main 19470
         *
         * 解决方式：在add()方法加synchronized关键字
         * 或者加lock锁
         */
    }
}
